//圈圈中最后剩下的数
//看完题解发现这道题纯粹是读不懂题，一大堆屁话其实问题比较简单。
//初级一点的思路，用链表保存n个数，然后依次循环m次，如果循环
//到达了链表的长度，那么令cur=0，继续循环即可
import java.util.ArrayList;
class Solution{
	public int LastRemaining_Solution(int n,int m){
	if(n<1||m<1)return -1;
	ArrayList<Integer> list=new ArrayList<>();
	for(int i=0;i<n;i++){
		list.add(i);
		}
	int cur=-1;//起点为-1，因为list中存储的数起点为0
	while(list.size()>1){
		for(int i=0;i<n;i++){
				cur++;//报数
				if(cur==list.size()){
					cur=0;//cur走到顺序表的len位置
				}
			}
		list.remove(cur);//走到m-1处，出队
		cur--;//cur--的原因，因为在更新的list中cur指向了下一个元素，
			  //为了保证移动m个准确性，所以cur向前移动一位
		}
	return list.get(0);
	}
}

//当然这种做法在时间复杂度上有点大，仔细观察后发现可以使用迭代做法

//假设f(n, m) 表示最终留下元素的序号。比如上例子中表示为:f(5,3) = 3

//首先，长度为 n 的序列会先删除第 m % n 个元素，然后剩下一个长度为 n - 1 的序列。
//那么，我们可以递归地求解 f(n - 1, m)，就可以知道对于剩下的 n - 1 个元素，最终
//会留下第几个元素，我们设答案为 x = f(n - 1, m)。

//由于我们删除了第 m % n 个元素，将序列的长度变为 n - 1。当我们知道了 f(n - 1, m)
//对应的答案 x 之后，我们也就可以知道，长度为 n 的序列最后一个删除的元素，应当是
//从 m % n 开始数的第 x 个元素。因此有 f(n, m) = (m % n + x) % n = (m + x) % n。

//f[1] = 0
//f[2] = (f{1] + m) % 2
//f[3] = (f[2] + m) % 3
//...
//f[n] = (f[n-1] + m) % n

class Solution{
	public int LastRemaining_Solution(int n,int m){
		if(n<1||m<1)return -1;
		int index=0;
		for(int i=2;i<=n;i++){
			index=(index+m)%i;
		}
	return index;
	}
}